home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 7 / BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso / Files / Hyper / S-Sh / ScrollControl.cpt / ScrollControl XCMD / card_7628.txt < prev    next >
Text File  |  1989-04-22  |  6KB  |  256 lines

  1. -- card: 7628 from stack: in
  2. -- bmap block id: 0
  3. -- flags: 0000
  4. -- background id: 7195
  5. -- name: 
  6.  
  7.  
  8. -- part contents for background part 3
  9. ----- text -----
  10. For those of you interested here is the source code listing for the ScrollControl XCMD done in Think Pascal‚Ñ¢. It was compiled and linked with the DRVRRuntime library. Then it was built and saved as a resource of type XCMD and pasted along via ResEdit into this stack.
  11.  
  12.  
  13.  
  14. -- part contents for background part 2
  15. ----- text -----
  16. unit ScrollBarForHypercard;
  17. interface
  18.  type
  19.   XCmdPtr = ^XCmdBlock;
  20.   XCmdBlock = record
  21.     paramCount: INTEGER;
  22.     params: array[1..16] of Handle;
  23.     returnValue: Handle;
  24.     passFlag: BOOLEAN;
  25.  
  26.     entryPoint: ProcPtr;
  27.     request: INTEGER;
  28.     result: INTEGER;
  29.     inArgs: array[1..8] of LongInt;
  30.     outArgs: array[1..4] of LongInt;
  31.    end;
  32.  
  33.  procedure main (paramPtr: XCmdPtr);
  34.  
  35. implementation
  36.  procedure ScrollControl (paramPtr: XCmdPtr);
  37.  forward;
  38.  
  39.  procedure main;
  40.  begin
  41.   ScrollControl(paramPtr);
  42.  end;
  43.  
  44.  procedure ScrollText (theControl: Controlhandle; thePart: integer);
  45.   var
  46.    oldvalue, delta: integer;
  47.  begin
  48.   if thePart <> 0 then
  49.    begin
  50.     oldValue := GetCtlValue(theControl);
  51.    end;
  52.   case thePart of
  53.    inUpButton: 
  54.     delta := -1;
  55.    inDownButton: 
  56.     delta := +1;
  57.    inPageUp: 
  58.     delta := -2;
  59.    inPageDown: 
  60.     delta := +2;
  61.    otherwise
  62.   end;
  63.   if thePart <> 0 then
  64.    SetCtlValue(theControl, oldValue + delta);
  65.  end;
  66.  
  67.  procedure ScrollControl;
  68.   const
  69.    xreqSendCardMessage = 1;
  70.    xreqEvalExpr = 2;
  71.    xreqPasToZero = 7;
  72.    xreqZeroToPas = 8;
  73.    xreqStrToNum = 10;
  74.    xreqStrToBool = 11;
  75.    xreqNumToStr = 14;
  76.   type
  77.    Str31 = string[31];
  78.   var
  79.    resultString: Str31;
  80.    theString: Str255;
  81.    whichWindow: WindowPtr;
  82.    myEvent: EventRecord;
  83.    box, ButtonRect: rect;
  84.    theBar: ControlHandle;
  85.    done, horizontal: boolean;
  86.    theControl: ControlHandle;
  87.    thePoint: Point;
  88.    thePart, oldValue, delta, NewCtlValue, CtlInitValue, CtlMinValue, CtlMaxValue: integer;
  89.  
  90.  
  91.   procedure DoJsr (addr: ProcPtr);
  92.   inline
  93.    $205F, $4E90;
  94.  
  95.   procedure ZeroToPas (zeroStr: Ptr; var pasStr: Str255);
  96.   begin
  97.    with paramPtr^ do
  98.     begin
  99.      inArgs[1] := ORD(zeroStr);
  100.      inArgs[2] := ORD(@pasStr);
  101.      request := xreqZeroToPas;
  102.      DoJsr(entryPoint);
  103.     end;
  104.   end;
  105.  
  106.   function EvalExpr (expr: Str255): Handle;
  107.   begin
  108.    with paramPtr^ do
  109.     begin
  110.      inArgs[1] := ORD(@expr);
  111.      request := xreqEvalExpr;
  112.      DoJsr(entryPoint);
  113.      EvalExpr := Handle(outArgs[1]);
  114.     end;
  115.   end;
  116.  
  117.   function StrToNum (str: Str31): LongInt;
  118.   begin
  119.    with paramPtr^ do
  120.     begin
  121.      inArgs[1] := ORD(@str);
  122.      request := xreqStrToNum;
  123.      DoJsr(entryPoint);
  124.      StrToNum := outArgs[1];
  125.     end;
  126.   end;
  127.  
  128.   function NumToStr (num: LongInt): Str31;
  129.    var
  130.     str: Str31;
  131.   begin
  132.    with paramPtr^ do
  133.     begin
  134.      inArgs[1] := num;
  135.      inArgs[2] := ORD(@str);
  136.      request := xreqNumToStr;
  137.      DoJsr(entryPoint);
  138.      NumToStr := str;
  139.     end;
  140.   end;
  141.  
  142.   procedure SendCardMessage (msg: Str255);
  143.   begin
  144.    with paramPtr^ do
  145.     begin
  146.      inArgs[1] := ORD(@msg);
  147.      request := xreqSendCardMessage;
  148.      DoJsr(entryPoint);
  149.     end;
  150.   end;
  151.  
  152.   function IntExpr (theString: str255): integer;
  153.    type
  154.     Ptr31 = ^str31;
  155.     Hand31 = ^Ptr31;
  156.    var
  157.     tempHand: handle;
  158.     ShortStr: str31;
  159.     NumLong: longint;
  160.     LongStr: str255;
  161.   begin
  162.    tempHand := EvalExpr(theString);
  163.    ZeroToPas(tempHand^, LongStr);
  164.    ShortStr := LongStr;
  165.    NumLong := StrToNum(ShortStr);
  166.    IntExpr := loword(NumLong);
  167.   end;
  168.  
  169.   procedure DoScroll (thePart: integer; thePoint: point);
  170.   begin
  171.    if thePart = InThumb then
  172.     begin
  173.      thePart := TrackControl(theBar, thePoint, nil);
  174.     end
  175.    else
  176.     begin
  177.      thePart := TrackControl(theBar, thePoint, @ScrollText);
  178.     end;
  179.    NewCtlValue := GetCtlValue(theControl);
  180.    resultString := NumToStr(NewCtlValue);
  181.    theString := concat('put ', resultString, ' into curCtlValue');
  182.    SendCardMessage(theString);
  183.   end;
  184.  
  185.   procedure doContent (whichWindow: windowPtr; thePoint: Point);
  186.    var
  187.     thePart: integer;
  188.   begin
  189.    GlobalToLocal(thePoint);
  190.    thePart := FindControl(thePoint, whichWindow, theControl);
  191.    DoScroll(thePart, thePoint)
  192.   end;
  193.  
  194.   procedure DrawScroll;
  195.    var
  196.     btnName: Str255;
  197.   begin
  198.    ButtonRect.left := IntExpr(concat('item 1 of the rect of the target'));
  199.    ButtonRect.top := IntExpr(concat('item 2 of the rect of the target'));
  200.    ButtonRect.right := IntExpr(concat('item 3 of the rect of  the target'));
  201.    ButtonRect.bottom := IntExpr(concat('item 4 of the rect of the target'));
  202.    setRect(box, ButtonRect.left, ButtonRect.top, ButtonRect.right, ButtonRect.bottom);
  203.    getPort(whichWindow);
  204.    setPort(whichWindow);
  205.    with ParamPtr^ do
  206.     begin
  207.      ZeroToPas(params[1]^, theString);
  208.      CtlMinValue := StrToNum(theString);
  209.      ZeroToPas(params[2]^, theString);
  210.      CtlMaxValue := StrToNum(theString);
  211.      ZeroToPas(params[3]^, theString);
  212.      CtlInitValue := StrToNum(theString);
  213.     end;
  214.    theBar := NewControl(whichWindow, box, '', true, 0, 0, 0, 16, 0);
  215.    SetCtlMax(theBar, CtlMaxValue);
  216.    SetCtlMin(theBar, CtlMinValue);
  217.    SetCtlValue(theBar, CtlInitValue);
  218.   end;
  219.  
  220.   procedure XCMDOff;
  221.   begin
  222.    DisposeControl(theBar);
  223.    done := true;
  224.   end;
  225.  
  226.  begin
  227.   done := false;
  228.   DrawScroll;
  229.   repeat
  230.    begin
  231.     GetMouse(thePoint);
  232.     if PtInRect(thePoint, box) then
  233.      begin
  234.      if GetNextEvent(everyEvent, myEvent) then
  235.      begin
  236.      case myEvent.what of
  237.      mouseDown: 
  238.      begin
  239.      if FindWindow(myEvent.where, whichWindow) = inContent then
  240.      begin
  241.      DoContent(whichWindow, myEvent.where);
  242.      end
  243.      else
  244.      XCMDOff;
  245.      end;
  246.      otherwise
  247.      end;
  248.      end;
  249.      end
  250.     else
  251.      XCMDOff;
  252.    end;
  253.   until done;
  254.  end;
  255. end.
  256.